package me.mingshan.leetcode;

/**
 * https://leetcode.cn/problems/reverse-string-ii
 *
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
 *
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 *
 * @author hanjuntao
 * @date 2025/6/7 0007
 */
public class L_541_reverse_string_ii {

    public static void main(String[] args) {
        String s = "abcdefg";
       reverseString(s, 2);
       // bacd feg
        System.out.println(s);

        //handle(s, 2, 5, 2);
        //System.out.println(Arrays.toString(s));
    }

    /**
     * 根据题意，每个2k个字符，反转前k个字符，剩余字符保持原样。
     *
     * 输入：s = "abcdefg", k = 2
     *
     * 4个分组，前两个反转，后两个保持原样
     * [abcd] ab -> ba
     * => [bacd]
     *
     * [efg] ef -> fe
     * => [efg]
     *
     * @param s
     * @param k
     */
    public static String reverseString(String s, int k) {
        char[] s1 = s.toCharArray();
        // 分组
        for (int i = 0; i < s1.length; i += 2 * k) {
            handle(s1, i, Math.min(i + 2*k - 1, s1.length - 1), k);
        }

        return new String(s1);
    }

    /**
     * [start, end] 为需要处理的分组
     *
     * k 为要翻转的字符个数
     * [start, start + k - 1] 为要翻转的区间
     *
     *
     *
     * @param s
     * @param start
     * @param end
     * @param k
     */
    private static void handle(char[] s, int start, int end, int k) {
        // 确定翻转的结束位置
        int reverseEnd = Math.min(start + k - 1, end);

        // 翻转字符, 使用双指针
        for (int i = start; i < reverseEnd; i++) {
            char temp = s[i];
            s[i] = s[reverseEnd];
            s[reverseEnd] = temp;
            reverseEnd--;
        }
    }
}
